
package ocio.actions;  

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import ocio.beans.Oferta;
import ocio.beans.Producto;
import ocio.services.ReservaService;
import ocio.services.ServiceLocator;
import ocio.services.OfertaService;
import com.opensymphony.xwork2.ActionSupport;
/**
 * Clase destinataria de petición de alta de una nueva reserva.
 * @author Esther García Galán
 * @author Rubén Gómez Vales
 * @version 1.0 13/05/2014
 * @see ocio.beans.Proveedor
 */
public class AddReservaAction extends ActionSupport {

	private static final long serialVersionUID = 1L;

	private int idOferta;
	private int numPlazas;
	private String fechaTexto;
	private Date fecha;
	
	private String mensaje ="";
	private Producto producto;
	private Oferta oferta;
	private double total;

    /**
	 * Método execute() de la clase ActionSupport de Struts 2. 
	 * Valida la fecha de reserva, comprueba que hay suficientes plazas disponibles y solicita las servicios
	 * para dar de alta la reserva.
	 * @return un string que indica la respuesta de la acción ejecutada sobre la petición del usuario
	 */
	public String execute(){	
		
		String resultado = "success";

		ServiceLocator serviceLocator = ServiceLocator.getServiceLocator();
		ReservaService reservaService = (ReservaService)serviceLocator.getService("Reserva");
		OfertaService ofertaService = (OfertaService)serviceLocator.getService("Oferta");
		
		// Recuperar oferta
		oferta = (Oferta)ofertaService.searchById(idOferta);
	  		
		if (oferta.getProducto().getTipo()==2){
			fecha=oferta.getFechaLim();
		} else {
			 try { 
					SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
					fecha = formatter.parse(this.fechaTexto);
					if (this.fechaTexto.length()<10){
						mensaje="Por favor, revise la fecha, debe tener formato dd/mm/aaaa";
						resultado = "input";
					}
					if (fecha.after(oferta.getFechaLim())){
						mensaje = "La oferta finaliza el día " + oferta.getFechaLim() + ". Elija otra fecha.";
						resultado = "input";
					}
					if (fecha.before(new Date())){
						mensaje = "La fecha elegida es anterior al día de hoy. Elija otra fecha.";
						resultado = "input";
					}
		
			 	} catch (ParseException e) {
				    setMensaje("El formato de fecha no es válido.");
				    resultado= "input";
			 	}
			
			 }
		
		// Comprobar si hay número suficiente de plazas
		int plDisponibles = oferta.getPlazasDisp() - oferta.getPlazasReserv();
		if (numPlazas>plDisponibles){
			mensaje = "No se ha podido registrar la reserva. Sólo quedan disponibles " + plDisponibles +" plazas.";
			resultado = "input";
		} 
		
		//Dar de alta la reserva
		if (resultado!="input"){
			reservaService.add(this);
			// Se actualiza el número de plazas reservadas
			oferta.setPlazasReserv(oferta.getPlazasReserv()+numPlazas);
			ofertaService.update(oferta);
			total = numPlazas * oferta.getPrecioXpersona();
		}
		
		producto = oferta.getProducto();
		
		
		return resultado;
	}



	public int getNumPlazas() {
		return numPlazas;
	}



	public void setNumPlazas(int numPlazas) {
		this.numPlazas = numPlazas;
	}


	public int getIdOferta(){
		return idOferta;
	}
	
	public void setIdOferta(int idOferta){
		this.idOferta = idOferta;
	}



	public Date getFecha() {
		return fecha;
	}



	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}



	public String getMensaje() {
		return mensaje;
	}



	public void setMensaje(String mensaje) {
		this.mensaje = mensaje;
	}



	public Producto getProducto() {
		return producto;
	}



	public void setProducto(Producto producto) {
		this.producto = producto;
	}



	public Oferta getOferta() {
		return oferta;
	}



	public void setOferta(Oferta oferta) {
		this.oferta = oferta;
	}



	public double getTotal() {
		return total;
	}



	public void setTotal(double total) {
		this.total = total;
	}



	public String getFechaTexto() {
		return fechaTexto;
	}



	public void setFechaTexto(String fechaTexto) {
		this.fechaTexto = fechaTexto;
	}

	
}
